package common.fengkai.filepost.utils;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import common.fengkai.filepost.bean.ocrBean.OcrRequestVo;
import common.fengkai.filepost.bean.ocrBean.OcrResultVo;
import common.fengkai.filepost.bean.ocrBean.RequestData;
import common.fengkai.filepost.bean.ocrBean.ResultData;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

import javax.annotation.PostConstruct;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * 太平OCR接口工具类
 */
@Slf4j
public class TpiOcrInterfaceUtil {


    /**
     *
     * @param bytes 章模图片字节流
     * @param url   ocr接口地址
     * @return
     * @throws Exception
     */
    public static String getOcrInfo(byte[] bytes, String url) throws Exception{
        log.info("进行章模图片OCR扫描---------------------------");
        String dataDigest = DigestUtils.sha256Hex(bytes).toUpperCase();
        String file = Base64.encodeBase64String(bytes);
        RestTemplate restTemplate = new RestTemplate();
        //封装请求参数
        OcrRequestVo ocrRequestBean = new OcrRequestVo();
        ocrRequestBean.setChannel_num("TPCX_YZXT_01");
        ocrRequestBean.setProcess_type("90027");
        List<RequestData> requestDataList = new ArrayList<>();
        RequestData request_data = new RequestData();
        request_data.setData_content(file);
        request_data.setData_id("xxx.png");
        request_data.setData_type("png");
        request_data.setData_digest(dataDigest);
        request_data.setData_size(bytes.length);
        requestDataList.add(request_data);
        ocrRequestBean.setRequest_data(requestDataList);
        JSONObject jsonObject = (JSONObject) JSONObject.toJSON(ocrRequestBean);
        //建立连接
        ResponseEntity<String> responseEntity = null;
        try {
            responseEntity = restTemplate.postForEntity(url, jsonObject, String.class);
        } catch (RestClientException e) {
            log.debug("连接发生异常,异常信息,{}",e.getMessage());
            e.printStackTrace();
        } finally {
        }
        //返回体解析
        String sealContent = TpiOcrInterfaceUtil.getSealContent(responseEntity);

        log.info("解析出来的结果:=========="+sealContent);

        return  sealContent;
    }

    /**
     * 对body进行解析，拿到扫描结果
     * @param
     * @return
     */
    private static String getSealContent(ResponseEntity<String> responseEntity) throws Exception{
        log.info("返回信息解析Start------------");
        String body = responseEntity.getBody();

        JSONObject parseObject = JSONObject.parseObject(body);
        OcrResultVo ocrResultVo = JSONObject.toJavaObject(parseObject, OcrResultVo.class);
        ResultData resultData = ocrResultVo.getData().get(0).getResult_data();
        String resultDataData = resultData.getData();
        log.info(resultDataData);
        /**
         解析文字内容
         */
        String substring = resultDataData.substring(resultDataData.indexOf("\"seal_content\""));
        String sealInfo = substring.substring(16, substring.indexOf("\",\"msg\""));
        log.info("解析的未解码文字信息，{}" ,sealInfo);
        //解析印章种类
        resultDataData=resultData.getData();
        String sealType = resultDataData.substring(resultDataData.indexOf("\"seal_type\""));
        String type = sealType.substring(13, sealType.indexOf("\",\"seal_content\""));

        switch (type){
            case "Administration_seal" : type = "行政章";
                 break;
            case "Business_seal" : type = "业务章";
                 break;

            default:
                break;
        }
        log.info("sealType=,{}",type);
        log.info("返回信息解析End------------");
        return Unicode2CnUtil.unicodeToCn(sealInfo)+","+type;

    }
       public static void main(String[] args) throws Exception {
          String url = "http://10.28.139.35:8080/ocr-api/v1.0/sync-data";
           String s = Base64util.encodeBase64File("C:\\Users\\carry\\Pictures\\章模.png");
           byte[] bytes = Base64util.decoderFileTobytes("C:\\Users\\carry\\Pictures\\章模.png");
           //byte[] bytes1 = FileUtils.readFileToByteArray(new File("H:\\项目文档\\太平_OCR接口文档\\90027_01.jpg"));
           byte[] bytes1 = FileUtils.readFileToByteArray
                   (new File("C:\\Users\\carry\\Pictures\\太平财产保险有限公司安徽分公司工会委员会4242.png"));
           TpiOcrInterfaceUtil.getOcrInfo(bytes1,url);
           /**
            * 通过测试：深圳分公司测试公章 太平财产保险有限公司合肥中心支公司承保专用章（测试）5633_Orig
            *
            * 识别不全  ：财务专用章-安徽分公司（只识别出财务专用，种类返回）  太平财产保险有限公司安徽分公司工会委员会4242(未能识别种类，文字只识别章)
            * 只从左往右自上而下读取 ： 何士宏印-2020（宏何印士）
            * 解析不出来 ： 太平财产保险有限公司青岛分公司中英文刘洪涛授权签名章（水险组合）7030_Orig（只返回了sealType） 许少武-手签章3526_Orig（都识别不了）
            *          中国共产党太平财产保险有限公司安徽分公司纪律检查委员会(3401040381390)4242 （都识别不了） 中国共产党太平财产保险有限公司安徽分公司委员会(3401040126659)4242
                   中国共产主义青年团太平财产保险有限公司安徽分公司委员会4040  刘世宏2915_Orig（解析结果不对）
            */

           /**
            * 章模  财务专用章-安徽分公司   sealType
            */
       }

}
